package socketmvc.core.packets.basic;

/**
 * 协议定义常量
 * @author xueyanjun
 */
public enum Protocol {

    // 简单消息协议
    JSON_SIMPLE_CONTENT(
            (byte) 0,
            "JSON_SIMPLE_CONTENT", """
            消息内容通过字符串传递,
            1 byte 协议类型 | 4 byte 消息长度 | n byte 消息内容
            """),
    JSON_TEXT_BASE64_CONTENT(
            (byte) 1,
            "JSON_TEXT_BASE64_CONTENT", """
            消息内容通过字符串传递，如果内容是文件类型，则使用base64编码内容,
            1 byte 协议类型 | 4 byte 消息长度 | n byte 消息(其中包含消息内容)
            """),
    JSON_TEXT_HEX_CONTENT(
            (byte) 2,
            "JSON_TEXT_HEX_CONTENT", """
            文本内容字符串传递，二进制内容使用hex编码的字符串传递
            1 byte 协议类型 | 4 byte 文本内容长度 | 4 byte 二进制内容长度 | n byte 文本内容  | n byte 二进制内容(hex编码)
            """),
    JSON_TEXT_BIN_CONTENT(
            (byte) 3,
            "JSON_TEXT_BIN_CONTENT", """
            消息内容通过bytes数组传递,
            1 byte 协议类型 | 4 byte 文本内容长度 | 4 byte 二进制内容长度 | n byte 文本内容  | n byte 二进制内容
            示例：[1 , 44 , 1 , 0 , 0 , 112 , 23 , 0 , 0 , ... , ...]
                该示例显示该消息文本段长度是300，二进制内容长度是6000;代表从字节数组的第10位开始到第300位结束是文本内容，从第301位到第6000位是二进制资源内容
            """),
    JSON_GZIP_TEXT_CONTENT(
            (byte) 4,
            "JSON_GZIP_TEXT_CONTENT", """
            消息内容通过字符串传递,但内容是经过gzip压缩后的内容
            1 byte 协议类型 | 4 byte 消息长度 | n byte 消息内容
            """);

    private final byte version;
    private final String name;
    private final String description;

    Protocol(byte version, String name, String description) {
        this.version = version;
        this.name = name;
        this.description = description;
    }

    public byte getVersion() {
        return version;
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }

    public static Protocol fromNumber(byte version){
        return switch (version) {
            case 0 -> JSON_SIMPLE_CONTENT;
            case 1 -> JSON_TEXT_BASE64_CONTENT;
            case 2 -> JSON_TEXT_HEX_CONTENT;
            case 3 -> JSON_TEXT_BIN_CONTENT;
            case 4 -> JSON_GZIP_TEXT_CONTENT;
            default -> null;
        };
    }
}
